package com.lagou.client;

import com.lagou.pojo.RpcRequest;
import com.lagou.service.UserService;
import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.ZkClient;

import java.util.List;
import java.util.UUID;

/**
 * 编程题一：
 *
 *    在基于Netty的自定义RPC的案例基础上，进行改造。基于Zookeeper实现简易版服务的注册与发现机制
 *
 * 要求完成改造版本：
 *
 * 1. 启动2个服务端，可以将IP及端口信息自动注册到Zookeeper
 *
 * 2. 客户端启动时，从Zookeeper中获取所有服务提供端节点信息，客户端与每一个服务端都建立连接
 *
 * 3. 某个服务端下线后，Zookeeper注册列表会自动剔除下线的服务端节点，客户端与下线的服务端断开连接
 *
 * 4. 服务端重新上线，客户端能感知到，并且与重新上线的服务端重新建立连接
 *

 * 编程题二：
 *
 *    基于作业一的基础上，实现基于Zookeeper的简易版负载均衡策略
 *
 * 要求完成改造版本：
 *
 * 1. Zookeeper记录每个服务端的最后一次响应时间，有效时间为5秒，5s内如果该服务端没有新的请求，响应时间清零或失效
 *
 * 2. 当客户端发起调用，每次都选择最后一次响应时间短的服务端进行服务调用，如果时间一致，随机选取一个服务端进行调用，从而实现负载均衡
 */
public class ClientBootStrap {

    public static  final String providerName="UserService#sayHello#";

    public static void main(String[] args) throws InterruptedException {

        String word = "are you ok?";

        RpcRequest rpcRequest = new RpcRequest();
        rpcRequest.setRequestId(UUID.randomUUID().toString().replaceAll("-",""));
        rpcRequest.setClassName(UserService.class.getSimpleName());
        rpcRequest.setMethodName("sayHello");
        rpcRequest.setParameters(new Object[]{word});
        rpcRequest.setParameterTypes(new Class<?>[]{word.getClass()});

        RpcConsumer rpcConsumer = new RpcConsumer();
        UserService proxy = (UserService) rpcConsumer.createProxy(UserService.class, rpcRequest);

        new Thread(()->{

            ZkClient zkClient = new ZkClient("127.0.0.1:2181", 5000);

            zkClient.subscribeChildChanges("/server", new IZkChildListener() {
                @Override
                public void handleChildChange(String s, List<String> list) throws Exception {
                    System.out.println("节点更新");
                    RpcConsumer.initClient();
                }
            });

        }).start();

        while (true){
            Thread.sleep(2000);
            System.out.println(proxy.sayHello(word));
        }


    }


}
